package com.hsjk.szwj.module.pay.util;

import com.hsjk.szwj.framework.common.enums.OssSavePlaceEnum;
import com.hsjk.szwj.framework.common.enums.OssServiceTypeEnum;
import com.hsjk.szwj.module.system.api.file.IOssApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;

/**
 * @author chenjiawei
 * @desc 支付平台 获取系统文件工具类
 * @Date 2023/08/21 09:52
 **/
@Component
@Slf4j
public class ChannelCertConfigKitBean {

    @Value("${szwj.oss.file-private-path}")
    private String filePrivatePath;
    @Value("${szwj.oss.service-type}")
    private String serviceType;
    @Resource
    private IOssApi ossApi;

    public String getCertFilePath(String certFilePath) {
        return getCertFile(certFilePath).getAbsolutePath();
    }

    public File getCertFile(String certFilePath) {
        log.info("getCertFile:{}", certFilePath);
        File certFile = new File(filePrivatePath + File.separator + certFilePath);
        // 本地存在直接返回
        if (certFile.exists()) {
            return certFile;
        }

        // 以下为 文件不存在的处理方式

        // 是否本地存储
        boolean isLocalSave = OssServiceTypeEnum.LOCAL.getServiceName()
                .equals(serviceType);

        // 本地存储 & 文件不存在
        if (isLocalSave) {
            return certFile;
        }

        // 已经向oss请求并且返回了空文件时
//        if (new File(certFile.getAbsolutePath() + ".notexists").exists()) {
//            return certFile;
//        }

        // 当文件夹不存在时， 需要创建。
        if (!certFile.getParentFile().exists()) {
            certFile.getParentFile().mkdirs();
        }

        // 请求下载并返回 新File
        return downloadFile(certFilePath, certFile);
    }


    /**
     * 下载文件
     **/
    private synchronized File downloadFile(String dbCertFilePath, File certFile) {

        //请求文件并写入
        boolean isSuccess = ossApi.downloadFile(OssSavePlaceEnum.PRIVATE, dbCertFilePath, certFile.getAbsolutePath());

        // 下载成功 返回新的File对象
        if (isSuccess) {
            return new File(certFile.getAbsolutePath());
        }

        // 下载失败， 写入.notexists文件， 避免那下次再次下载影响效率。

        try {
            new File(certFile.getAbsolutePath() + ".notexists").createNewFile();
        } catch (IOException e) {
        }

        return certFile;
    }
}
